Estructuras dinámicas de datos
Consultas, lista de correo 'C++ Con Clase' 'C++ Con Clase' página de entrada Librerías estándar C Tabla de contenido Contactar con Webmaster
*Introducción
*1. Listas abiertas
*2. Pilas
 . 2.1 Definición
 . 2.2 Tipos de datos
 . 2.3 Operaciones básicas
 . 2.4 Push, insertar
 . 2.5 Pop, leer y eliminar
 . 2.6 Ejemplo en C
 . 2.7 Ejemplo en C++
 . 2.8 Ejemplo C++ plantillas
*3. Colas
*4. Listas circulares
*5. Listas doblemente enlazadas
*6. Árboles
*7. Árboles binarios de búsqueda (ABB)
*8. Árboles AVL
*Descarga de ejemplos
<< < > >>

2.7 Ejemplo de pila en C++ usando clases:  

Al igual que pasaba con las listas, usando clases el programa cambia bastante. Las clases para pilas son versiones simplificadas de las mismas clases que usamos para listas.

Para empezar, necesitaremos dos clases, una para nodo y otra para pila. Además la clase para nodo debe ser amiga de la clase pila, ya que ésta debe acceder a los miembros privados de nodo.

class nodo {
   public:
    nodo(int v, nodo *sig = NULL) {
       valor = v;
       siguiente = sig;
    }

   private:
    int valor;
    nodo *siguiente;
        
   friend class pila;
};
 
typedef nodo *pnodo;
 
class pila {
   public:
    pila() : ultimo(NULL) {}
    ~pila();
    
    void Push(int v);
    int Pop();
    
   private:
    pnodo ultimo;
};

Los algoritmos para Push y Pop son los mismos que expusimos para el ejemplo C, tan sólo cambia el modo de crear y destruir nodos.

Código del ejemplo completo:

#include <iostream>
using namespace std;
 
class nodo {
   public:
    nodo(int v, nodo *sig = NULL) {
       valor = v;
       siguiente = sig;
    }

   private:
    int valor;
    nodo *siguiente;
        
   friend class pila;
};
 
typedef nodo *pnodo;
 
class pila {
   public:
    pila() : ultimo(NULL) {}
    ~pila();
    
    void Push(int v);
    int Pop();

   private:
    pnodo ultimo;
};
 
pila::~pila() {
   while(ultimo) Pop();
}

void pila::Push(int v) {
   pnodo nuevo;
 
   /* Crear un nodo nuevo */
   nuevo = new nodo(v, ultimo);
   /* Ahora, el comienzo de nuestra pila es en nuevo nodo */
   ultimo = nuevo;
}

int pila::Pop() {

   pnodo nodo; /* variable auxiliar para manipular nodo */
   int v;      /* variable auxiliar para retorno */
   
   if(!ultimo) return 0; /* Si no hay nodos en la pila retornamos 0 */
   /* Nodo apunta al primer elemento de la pila */
   nodo = ultimo;
   /* Asignamos a pila toda la pila menos el primer elemento */
   ultimo = nodo->siguiente;
   /* Guardamos el valor de retorno */
   v = nodo->valor; 
   /* Borrar el nodo */
   delete nodo;
   return v;
}

int main() {
   pila Pila;

   Pila.Push(20);
   cout << "Push(20)" << endl;
   Pila.Push(10);
   cout << "Push(10)" << endl;
   cout << "Pop() = " << Pila.Pop() << endl;
   Pila.Push(40);
   cout << "Push(40)" << endl;
   Pila.Push(30);
   cout << "Push(30)" << endl;
   cout << "Pop() = " << Pila.Pop() << endl;
   cout << "Pop() = " << Pila.Pop() << endl;
   Pila.Push(90);
   cout << "Push(90)" << endl;
   cout << "Pop() = " << Pila.Pop() << endl;
   cout << "Pop() = " << Pila.Pop() << endl;

   cin.get();
   return 0;
}

Fichero con el código fuente: Descarga de programas

<< < > >>